From 84a5d85faf8b93d30f8b41d960783a6b52f7fed5 Mon Sep 17 00:00:00 2001 From: "cl349@freefall.cl.cam.ac.uk" Date: Mon, 2 Aug 2004 10:36:56 +0000 Subject: [PATCH] bitkeeper revision 1.1108.48.1 (410e1948_L7KCN9h17cq5QeBniYH6g) use the tsc to interpolate time values when the time structure in shared_info isn't quite uptodate --- linux-2.4.26-xen-sparse/arch/xen/kernel/time.c | 3 ++- linux-2.6.7-xen-sparse/arch/xen/i386/kernel/time.c | 5 ++++- .../arch/xen/i386/kernel/timers/timer_tsc.c | 4 +++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/linux-2.4.26-xen-sparse/arch/xen/kernel/time.c b/linux-2.4.26-xen-sparse/arch/xen/kernel/time.c index caf89614a3..825b188d65 100644 --- a/linux-2.4.26-xen-sparse/arch/xen/kernel/time.c +++ b/linux-2.4.26-xen-sparse/arch/xen/kernel/time.c @@ -391,7 +391,8 @@ static inline void do_timer_interrupt(int irq, void *dev_id, __get_time_values_from_xen(); - if ( (delta = (s64)(shadow_system_time - processed_system_time)) < 0 ) + if ( (delta = (s64)(shadow_system_time + __get_time_delta_usecs() * 1000 - + processed_system_time)) < 0 ) { printk("Timer ISR: Time went backwards: %lld\n", delta); return; diff --git a/linux-2.6.7-xen-sparse/arch/xen/i386/kernel/time.c b/linux-2.6.7-xen-sparse/arch/xen/i386/kernel/time.c index 276a61f695..82a8a91d81 100644 --- a/linux-2.6.7-xen-sparse/arch/xen/i386/kernel/time.c +++ b/linux-2.6.7-xen-sparse/arch/xen/i386/kernel/time.c @@ -88,6 +88,7 @@ EXPORT_SYMBOL(i8253_lock); struct timer_opts *cur_timer = &timer_none; extern u64 shadow_system_time; +extern u32 shadow_time_delta_usecs; extern void __get_time_values_from_xen(void); /* Keep track of last time we did processing/updating of jiffies and xtime. */ @@ -300,7 +301,9 @@ irqreturn_t timer_interrupt(int irq, void *dev_id, struct pt_regs *regs) __get_time_values_from_xen(); - delta = (s64)(shadow_system_time - processed_system_time); + shadow_time_delta_usecs = cur_timer->get_offset() * NSEC_PER_USEC; + delta = (s64)(shadow_system_time + shadow_time_delta_usecs - + processed_system_time); if (delta < 0) { printk("Timer ISR: Time went backwards: %lld\n", delta); goto out; diff --git a/linux-2.6.7-xen-sparse/arch/xen/i386/kernel/timers/timer_tsc.c b/linux-2.6.7-xen-sparse/arch/xen/i386/kernel/timers/timer_tsc.c index eca23fd677..623b85c9de 100644 --- a/linux-2.6.7-xen-sparse/arch/xen/i386/kernel/timers/timer_tsc.c +++ b/linux-2.6.7-xen-sparse/arch/xen/i386/kernel/timers/timer_tsc.c @@ -85,6 +85,7 @@ static u32 shadow_tsc_stamp; u64 shadow_system_time; static u32 shadow_time_version; static struct timeval shadow_tv; +u32 shadow_time_delta_usecs; static unsigned int rdtsc_bitshift; extern u64 processed_system_time; @@ -192,7 +193,8 @@ static void mark_offset_tsc(void) write_seqlock(&monotonic_lock); - delta = (s64)(shadow_system_time - processed_system_time); + delta = (s64)(shadow_system_time + shadow_time_delta_usecs - + processed_system_time); /* Process elapsed jiffies since last call. */ while (delta >= NS_PER_TICK) { -- 2.30.2